;  Fuente: http://www.iesleonardo.info/ele/pro/CURSO%202001-2002/p02-luis/
;  Clock: 4MHz , XT. -> Ciclo = 1 uS.
;  Reset: Power On Reset.
;  Watch dog: Inhabilitado.
;  Proteccin de cdigo: Inhabilitado.
;  Ficheros requeridos: H16F84A.inc, LCD1602.inc
;  Funcin : Genera un TERMMETRO DIGITAL en un LCD.                        
;#############################################################

        LIST      p=PIC16F84A         ; Directiva para definir micro.
        #include <H16F84A.inc>        ; Fichero st ndard de cabezera.
                                       

        __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


;#################### DEFINICIONES ###########################

Lcd_var		EQU	0X10		
CONTA1		EQU	0X08
CONTA2		EQU	0X09
ASCI            EQU     0X12
CONTA3		EQU	0X20
CONTA4		EQU	0X21
TEMPERATURA	EQU	0X24
UNIT		EQU	0X25
DECT		EQU	0X26
DIEZ            EQU     0X27
UNO             EQU     0X28
UNI             EQU     0X29
;################ COMIENZO DEL PROGRAMA  #####################
                                
                ORG     0X00    
                GOTO    INICIO                                                                           

;################ PROGRAMA PRINCIPAL #########################
                ORG	0X05
                #include <LCD1602.inc>        ; Fichero  de rutinas LCD.

;*********TABLA DE VALORES DE TEMPERATURA.*******************
;************************************************************
;Rutina: TABLA
;Funcion: Tabla con los valores de la temperatura para representar en el LCD.
;Entradas: W.
;Salidas: W.
;Variables utilizadas: Ninguna.
;************************************************************

TABLA           ADDWF   PCL,F           ;SUMA W A PCL
                RETLW   B'10000011'     ;- 3C POS.0
                RETLW   B'10000010'     ;- 2C POS.1
                RETLW   B'10000001'     ;- 1C POS.2
                RETLW   B'00000000'     ;  0C POS.3
                RETLW   B'00000001'     ;+ 1C POS.4
                RETLW   B'00000010'     ;+ 2C POS.5
                RETLW   B'00000011'     ;+ 3C POS.6
                RETLW   B'00000100'     ;+ 4C POS.7
                RETLW   B'00000101'     ;+ 5C POS.8
                RETLW   B'00000110'     ;+ 6C POS.9
                RETLW   B'00000111'     ;+ 7C POS.10
                RETLW   B'00001000'     ;+ 8C POS.11
                RETLW   B'00001001'     ;+ 9C POS.12
                RETLW   B'00001010'     ;+10C POS.13
                RETLW   B'00001011'     ;+11C POS.14
                RETLW   B'00001100'     ;+12C POS.15
                RETLW   B'00001101'     ;+13C POS.16
                RETLW   B'00001110'     ;+14C POS.17
                RETLW   B'00001111'     ;+15C POS.18
                RETLW   B'00010000'     ;+16C POS.19
                RETLW   B'00010001'     ;+17C POS.20
                RETLW   B'00010010'     ;+18C POS.21
                RETLW   B'00010011'     ;+19C POS.22
                RETLW   B'00010100'     ;+20C POS.23
                RETLW   B'00010101'     ;+21C POS.24
                RETLW   B'00010110'     ;+22C POS.25
                RETLW   B'00010111'     ;+23C POS.26
                RETLW   B'00011000'     ;+24C POS.27
                RETLW   B'00011001'     ;+25C POS.28
                RETLW   B'00011010'     ;+26C POS.29
                RETLW   B'00011011'     ;+27C POS.30
                RETLW   B'00011100'     ;+28C POS.31
                RETLW   B'00011101'     ;+29C POS.32
                RETLW   B'00011110'     ;+30C POS.33
                RETLW   B'00011111'     ;+31C POS.34
                RETLW   B'00100000'     ;+32C POS.35
                RETLW   B'00100001'     ;+33C POS.36
                RETLW   B'00100010'     ;+34C POS.37
                RETLW   B'00100011'     ;+35C POS.38
                RETLW   B'00100100'     ;+36C POS.39
                RETLW   B'00100101'     ;+37C POS.40
                RETLW   B'00100110'     ;+38C POS.41
                RETLW   B'00100111'     ;+39C POS.43
                RETLW   B'00101000'     ;+40C POS.44
                RETLW   B'00101000'     ;+40C POS.45
                RETLW   B'00101000'     ;+40C POS.46
                RETLW   B'00101000'     ;+40C POS.47
                RETLW   B'00101000'     ;+40C POS.48
                RETLW   B'00101000'     ;+40C POS.49
                RETLW   B'00101000'     ;+40C POS.50
       
		RETURN			;RETORNA DE LA SUBRUTINA.

;*************** INICIALIZACION DEL PROGRAMA.*****************
					
INICIO		BSF     STATUS,RP0      ;PONEMOS LOS PUERTOS A Y B COMO SALIDAS,
                CLRF    TRISB           
                CLRF    TRISA           
                BCF   	STATUS,RP0
                MOVLW   B'00110000'     ;INTRODUCIMOS EL N '00110000' EN EL REGISTRO
                MOVWF   ASCI            ;ASCI.
                CALL    LCD_INI         ;INICIALIZAMOS EL DISPLAY LCD.

		MOVLW	B'00001100'	;DISPLAY LCD SIN PARPADEO Y SIN CURSOR.
		CALL	LCD_REG
		
		MOVLW	0X80		;VISUALIZACION DE LA FRASE "LA TEMPERATURA"
		CALL	LCD_REG		;EN LA PRIMERA LINEA DEL DISPLAY LCD MEDIANTE
		MOVLW	'L'		;LAS ORDENES LCD_REG Y LCD_DATO DEL ARCHIVO
                CALL    LCD_DATO        ;LCD1602.INC.
		MOVLW	'A'
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVLW	'T'
		CALL	LCD_DATO
		MOVLW	'E'
		CALL	LCD_DATO
		MOVLW	'M'
		CALL	LCD_DATO
		MOVLW	'P'
		CALL	LCD_DATO
		MOVLW	'E'
		CALL	LCD_DATO
		MOVLW	'R'
		CALL	LCD_DATO
		MOVLW	'A'
		CALL	LCD_DATO
		MOVLW	'T'
		CALL	LCD_DATO
		MOVLW	'U'
		CALL	LCD_DATO
		MOVLW	'R'
		CALL	LCD_DATO
		MOVLW	'A'
		CALL	LCD_DATO

		MOVLW	0XC0		;VISUALIZACION DE LA FRASE "ES DE: +00C"
		CALL	LCD_REG		;EN LA SEGUNDA LINEA DEL DISPLAY LCD MEDIANTE
		MOVLW	'E'		;LAS ORDENES LCD_REG Y LCD_DATO DEL ARCHIVO
		CALL	LCD_DATO	;LCD_CXX.INC.
		MOVLW	'S'
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVLW	'D'
		CALL	LCD_DATO
		MOVLW	'E'
		CALL	LCD_DATO
		MOVLW	':'
		CALL	LCD_DATO
		MOVLW	' '
		CALL	LCD_DATO
		MOVLW	'+'
		CALL	LCD_DATO
		MOVLW	'0'
		CALL	LCD_DATO
		MOVLW	'0'
		CALL	LCD_DATO
		MOVLW	B'11011111'
		CALL	LCD_DATO
		MOVLW	'C'
		CALL	LCD_DATO

;*************** COMIENZO DEL PROGRAMA PRINCIPAL.*************

PRINCIPAL	MOVLW	B'00011000'	;DESHABILITACION DEL DISPLAY Y EL ADC.
		MOVWF	PORTA

		CALL	TEMPO1		;TEMPORIZACIONES PARA EL BUEN FUNCIONAMIENTO
		CALL	TEMPO1		;DEL ADC.
		CALL	TEMPO1
		CALL	TEMPO1
		CALL	TEMPO1

		BSF     STATUS,RP0 	;PUERTO B COMO ENTRADAS PARA RECIBIR DATOS,
		MOVLW	B'11111111'	;HABILITACION DEL ADC COMO LECTURA.
		MOVWF	TRISB
		BCF     STATUS,RP0 
		MOVLW	B'00010000'
		MOVWF	PORTA

		CALL	TEMPO1		;TEMPORIZACION PARA TERMINAR DE REALIZAR
		CALL	TEMPO1		;LA LECTURA EL ADC.
		CALL	TEMPO1
		CALL	TEMPO1
		CALL	TEMPO1	

		MOVLW	B'00000000'	;HABILITACION DE LA ESCRITURA DEL ADC.
		MOVWF	PORTA

		CALL	TEMPO1		;TEMPORIZACION PARA TERMINAR DE REALIZAR
		CALL	TEMPO1		;LA ESCRITURA DEL ADC.
		CALL	TEMPO1
		CALL	TEMPO1
		CALL	TEMPO1	

		MOVF	PORTB,W		;RECOGIDA DE DATOS DEL ADC, LLAMADA A TABLA
		CALL	TABLA		;PARA LA CONVERSION DE DATOS Y ALMACENAJE DE 
		MOVWF	TEMPERATURA	;ESTOS DATOS EN REGISTRO TEMPERATURA.

		BSF     STATUS,RP0 	;PUERTO B COMO SALIDAS, DESHABILITACION DEL ADC
		CLRF	TRISB  		;Y HABILITACION DEL DISPLAY LCD.
                BCF   	STATUS,RP0 
		MOVLW	B'00011100'	
		MOVWF	PORTA

		BTFSS	TEMPERATURA,7	;PREGUNTA SI EL DATO ES POSITIVO O
		GOTO	POSITIVO	;NEGATIVO CON EL BIT 7 DEL REGISTRO TEMPERATURA.
		GOTO	NEGATIVO

POSITIVO	MOVLW	0XC7		;MANDA EL SIGNO '+' A LA POSICION 0XC7
		CALL	LCD_REG		;DEL DISPLAY LCD Y SALTA A LA POSICION
		MOVLW	'+'		;FINT.
		CALL	LCD_DATO
		GOTO	FINT

NEGATIVO	BCF	TEMPERATURA,7	;PONE A CERO EL BIT 7 DEL REGISTRO TEMPERATURA
		MOVLW	0XC7		;Y MANDA EL SIGNO '-' A LA POSICION 0XC7
                CALL    LCD_REG         ;DEL DISPLAY LCD.
                MOVLW   '-'             
		CALL	LCD_DATO
                				
FINT		CALL	BCDT		;LLAMA A LA SUBRUTINA DE CONVERSION A BCD.

		MOVLW	0XC9		;ESCRIBE EL DATO DEL REGISTRO UNIT EN LA 
		CALL	LCD_REG		;POSICION 0XC9 DEL DISPLAY LCD.
                MOVF    UNIT,W
		CALL	LCD_DATO

		MOVLW	0XC8		;ESCRIBE EL DATO DEL REGISTRO DECT EN LA 
		CALL	LCD_REG		;POSICION 0XC8 DEL DISPLAY LCD.
		MOVF	DECT,W
		CALL	LCD_DATO

		GOTO	PRINCIPAL	;SALTA A LA POSICION PRINCIPAL.

;******************** SUBRUTINA TEMPO1.**********************
;*************************************************************
;Rutina: TEMPO1
;Funcion: Retardo para la correcta lectura del ADC con 2 contadores en decimal
;         de 255 y 40 respectivamente.
;Entradas: Ninguna.
;Salidas: Ninguna.
;Variables utilizadas: CONTA3,CONTA4
;*************************************************************					
TEMPO1          MOVLW   .255            ;SUBRUTINA DE TEMPORIZACION MEDIANTE
		MOVWF	CONTA3		;DOS CONTADORES CARGADOS CON LOS NUMEROS
                MOVLW   .40             ;EN DECIMAL 255 Y 40 RESPECTIVAMENTE.
		MOVWF	CONTA4		
					
BUCLE3		DECFSZ	CONTA3,1	
		GOTO	BUCLE3		
					
BUCLE4		DECFSZ	CONTA4,1	
		GOTO	BUCLE3		
		RETURN			
				
;************ CONVERSION A BCD DE LA TEMPERATURA.*************
;************************************************************
;Rutina: BCDT
;Funcion: Convierte los valores analogicos de temperatura a digitales para
;         separar las decenas de las unidades y convertirlo en valor ASCI.
;Entradas: TEMPERATURA, ASCI.
;Salidas: UNIT, DECT.
;Variables utilizadas: Ninguna.
;************************************************************

BCDT		CLRF	UNIT		;SUBRUTINA QUE CONVIERTE EL VALOR EN 
                CLRF    DECT            ;BINARIO DE UN REGISTRO A BCD.
                MOVLW   B'00001010'     ;VARIABLE DIEZ=10.
                MOVWF   DIEZ            
                MOVLW   B'00000001'     ;VARIABLE UNO=1.
                MOVWF   UNO
                GOTO    DOS
PRINCI          INCF    DECT,F          ;INCREMENTAMOS DECT EN 1 POR CADA 
DOS             MOVF    TEMPERATURA,W   ;DECENA DE TEMPERATURA.
TRES            MOVWF   UNI              
                MOVF    DIEZ,W
                SUBWF   TEMPERATURA,F   ;RESTAMOS 10 A LA TEMPERATURA PARA 
                BTFSC   STATUS,C        ;SEPARAR LAS DECENAS DE LAS UNIDADES.
                GOTO    PRINCI
                GOTO    CUATRO
CINCO           INCF    UNIT,F          ;INCREMENTAMOS UNIT EN 1 POR CADA
CUATRO          MOVF    UNO,W           ;UNIDAD DE TEMPERATURA.
                SUBWF   UNI,F           ;RESTAMOS 1 A LAS UNIDADES PARA SABER
                BTFSC   STATUS,C        ;LAS UNIDADES.
                GOTO    CINCO
                MOVF    ASCI,W          ;CONVERTIMOS EL VALOR DE UNIT A ASCI.
                XORWF   UNIT
                MOVF    ASCI,W          ;CONVERTIMOS EL VALOR DE DECT A ASCI.
                XORWF   DECT
                RETURN
;################ FIN PROGRAMA PRINCIPAL #####################
                END                     ; Fin de programa

